package com.demo.sharelucas.hiddenclass;

import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FixedValue;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Modifier;

public class HiddenClassExample {
    public static void main(String[] args) throws Throwable {
        // 创建一个 MethodHandles.Lookup 对象
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        // 动态生成一个类字节码，可以使用框架如 ASM 或 ByteBuddy
        byte[] classBytes = generateHiddenClassBytes();  // 假设该方法生成类的字节码

        // 定义隐藏类
        Class<?> hiddenClass = lookup.defineHiddenClass(classBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE).lookupClass();

        // 通过反射创建类的实例
        Object hiddenClassInstance = hiddenClass.getDeclaredConstructor().newInstance();

        // 调用隐藏类中的方法
       var value= hiddenClass.getMethod("hello").invoke(hiddenClassInstance);
        System.out.println(value);
    }

    // 用于生成类字节码的示例方法（伪代码），实际应用中可以使用 ASM 或 ByteBuddy 生成
    private static byte[] generateHiddenClassBytes() {
        // 这里可以通过字节码生成工具生成字节码，返回一个字节数组
        // 这个字节码代表一个包含 "hello" 方法的类
        DynamicType.Unloaded<?> dynamicType = new ByteBuddy()
                .subclass(Object.class)
                .name("com.demo.sharelucas.hiddenclass.ExampleClass") // 确保类名及包名与 Lookup 匹配
                .defineMethod("hello", String.class, Modifier.PUBLIC)
                .intercept(FixedValue.value("Hello World!"))
                .make();
        return dynamicType.getBytes();

    }
}
